/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import controlador.exceptions.NonexistentEntityException;
import controlador.exceptions.PreexistingEntityException;
import entidad.DetalleDePlato;
import entidad.DetalleDePlatoPK;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidad.Unidaddemedida;
import entidad.Producto;
import entidad.Platos;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author a
 */
public class DetalleDePlatoJpaController implements Serializable {

    public DetalleDePlatoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(DetalleDePlato detalleDePlato) throws PreexistingEntityException, Exception {
        if (detalleDePlato.getDetalleDePlatoPK() == null) {
            detalleDePlato.setDetalleDePlatoPK(new DetalleDePlatoPK());
        }
        detalleDePlato.getDetalleDePlatoPK().setPlatosidPlatos(detalleDePlato.getPlatos().getIdPlatos());
        detalleDePlato.getDetalleDePlatoPK().setProductoidProducto(detalleDePlato.getProducto().getIdProducto());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Unidaddemedida unidadDeMedidaidUnidadDeMedida = detalleDePlato.getUnidadDeMedidaidUnidadDeMedida();
            if (unidadDeMedidaidUnidadDeMedida != null) {
                unidadDeMedidaidUnidadDeMedida = em.getReference(unidadDeMedidaidUnidadDeMedida.getClass(), unidadDeMedidaidUnidadDeMedida.getIdUnidadDeMedida());
                detalleDePlato.setUnidadDeMedidaidUnidadDeMedida(unidadDeMedidaidUnidadDeMedida);
            }
            Producto producto = detalleDePlato.getProducto();
            if (producto != null) {
                producto = em.getReference(producto.getClass(), producto.getIdProducto());
                detalleDePlato.setProducto(producto);
            }
            Platos platos = detalleDePlato.getPlatos();
            if (platos != null) {
                platos = em.getReference(platos.getClass(), platos.getIdPlatos());
                detalleDePlato.setPlatos(platos);
            }
            em.persist(detalleDePlato);
            if (unidadDeMedidaidUnidadDeMedida != null) {
                unidadDeMedidaidUnidadDeMedida.getDetalleDePlatoCollection().add(detalleDePlato);
                unidadDeMedidaidUnidadDeMedida = em.merge(unidadDeMedidaidUnidadDeMedida);
            }
            if (producto != null) {
                producto.getDetalleDePlatoCollection().add(detalleDePlato);
                producto = em.merge(producto);
            }
            if (platos != null) {
                platos.getDetalleDePlatoCollection().add(detalleDePlato);
                platos = em.merge(platos);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findDetalleDePlato(detalleDePlato.getDetalleDePlatoPK()) != null) {
                throw new PreexistingEntityException("DetalleDePlato " + detalleDePlato + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(DetalleDePlato detalleDePlato) throws NonexistentEntityException, Exception {
        detalleDePlato.getDetalleDePlatoPK().setPlatosidPlatos(detalleDePlato.getPlatos().getIdPlatos());
        detalleDePlato.getDetalleDePlatoPK().setProductoidProducto(detalleDePlato.getProducto().getIdProducto());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleDePlato persistentDetalleDePlato = em.find(DetalleDePlato.class, detalleDePlato.getDetalleDePlatoPK());
            Unidaddemedida unidadDeMedidaidUnidadDeMedidaOld = persistentDetalleDePlato.getUnidadDeMedidaidUnidadDeMedida();
            Unidaddemedida unidadDeMedidaidUnidadDeMedidaNew = detalleDePlato.getUnidadDeMedidaidUnidadDeMedida();
            Producto productoOld = persistentDetalleDePlato.getProducto();
            Producto productoNew = detalleDePlato.getProducto();
            Platos platosOld = persistentDetalleDePlato.getPlatos();
            Platos platosNew = detalleDePlato.getPlatos();
            if (unidadDeMedidaidUnidadDeMedidaNew != null) {
                unidadDeMedidaidUnidadDeMedidaNew = em.getReference(unidadDeMedidaidUnidadDeMedidaNew.getClass(), unidadDeMedidaidUnidadDeMedidaNew.getIdUnidadDeMedida());
                detalleDePlato.setUnidadDeMedidaidUnidadDeMedida(unidadDeMedidaidUnidadDeMedidaNew);
            }
            if (productoNew != null) {
                productoNew = em.getReference(productoNew.getClass(), productoNew.getIdProducto());
                detalleDePlato.setProducto(productoNew);
            }
            if (platosNew != null) {
                platosNew = em.getReference(platosNew.getClass(), platosNew.getIdPlatos());
                detalleDePlato.setPlatos(platosNew);
            }
            detalleDePlato = em.merge(detalleDePlato);
            if (unidadDeMedidaidUnidadDeMedidaOld != null && !unidadDeMedidaidUnidadDeMedidaOld.equals(unidadDeMedidaidUnidadDeMedidaNew)) {
                unidadDeMedidaidUnidadDeMedidaOld.getDetalleDePlatoCollection().remove(detalleDePlato);
                unidadDeMedidaidUnidadDeMedidaOld = em.merge(unidadDeMedidaidUnidadDeMedidaOld);
            }
            if (unidadDeMedidaidUnidadDeMedidaNew != null && !unidadDeMedidaidUnidadDeMedidaNew.equals(unidadDeMedidaidUnidadDeMedidaOld)) {
                unidadDeMedidaidUnidadDeMedidaNew.getDetalleDePlatoCollection().add(detalleDePlato);
                unidadDeMedidaidUnidadDeMedidaNew = em.merge(unidadDeMedidaidUnidadDeMedidaNew);
            }
            if (productoOld != null && !productoOld.equals(productoNew)) {
                productoOld.getDetalleDePlatoCollection().remove(detalleDePlato);
                productoOld = em.merge(productoOld);
            }
            if (productoNew != null && !productoNew.equals(productoOld)) {
                productoNew.getDetalleDePlatoCollection().add(detalleDePlato);
                productoNew = em.merge(productoNew);
            }
            if (platosOld != null && !platosOld.equals(platosNew)) {
                platosOld.getDetalleDePlatoCollection().remove(detalleDePlato);
                platosOld = em.merge(platosOld);
            }
            if (platosNew != null && !platosNew.equals(platosOld)) {
                platosNew.getDetalleDePlatoCollection().add(detalleDePlato);
                platosNew = em.merge(platosNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                DetalleDePlatoPK id = detalleDePlato.getDetalleDePlatoPK();
                if (findDetalleDePlato(id) == null) {
                    throw new NonexistentEntityException("The detalleDePlato with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(DetalleDePlatoPK id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleDePlato detalleDePlato;
            try {
                detalleDePlato = em.getReference(DetalleDePlato.class, id);
                detalleDePlato.getDetalleDePlatoPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The detalleDePlato with id " + id + " no longer exists.", enfe);
            }
            Unidaddemedida unidadDeMedidaidUnidadDeMedida = detalleDePlato.getUnidadDeMedidaidUnidadDeMedida();
            if (unidadDeMedidaidUnidadDeMedida != null) {
                unidadDeMedidaidUnidadDeMedida.getDetalleDePlatoCollection().remove(detalleDePlato);
                unidadDeMedidaidUnidadDeMedida = em.merge(unidadDeMedidaidUnidadDeMedida);
            }
            Producto producto = detalleDePlato.getProducto();
            if (producto != null) {
                producto.getDetalleDePlatoCollection().remove(detalleDePlato);
                producto = em.merge(producto);
            }
            Platos platos = detalleDePlato.getPlatos();
            if (platos != null) {
                platos.getDetalleDePlatoCollection().remove(detalleDePlato);
                platos = em.merge(platos);
            }
            em.remove(detalleDePlato);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<DetalleDePlato> findDetalleDePlatoEntities() {
        return findDetalleDePlatoEntities(true, -1, -1);
    }

    public List<DetalleDePlato> findDetalleDePlatoEntities(int maxResults, int firstResult) {
        return findDetalleDePlatoEntities(false, maxResults, firstResult);
    }

    private List<DetalleDePlato> findDetalleDePlatoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(DetalleDePlato.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public DetalleDePlato findDetalleDePlato(DetalleDePlatoPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(DetalleDePlato.class, id);
        } finally {
            em.close();
        }
    }

    public int getDetalleDePlatoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<DetalleDePlato> rt = cq.from(DetalleDePlato.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
